<?php
/**
 * Tydny Controller for Ohlasky Component
 * @license		GNU/GPL
 */

// No direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

/**
 * Ohlasky Tydny Controller
 * @subpackage Components
 */
class OhlaskysControllerTyden_rucne extends OhlaskysController
{


    function vytvorTydenRucne() {
        $chyba = '';
        $cisl_ty_rok_den_arr = $this->getTydenRucne();
        if (is_array($cisl_ty_rok_den_arr)) {
            $chyba = $cisl_ty_rok_den_arr['chyba'];
        } else {
            $chyba = 'Interní chyba kontroler Tyden_rucne!';
        }

        if (empty($chyba)) {
            JRequest::setVar( 'tyden_cislo_rucne', $cisl_ty_rok_den_arr['cislo_tydne_int'] );
            JRequest::setVar( 'rok_rucne', $cisl_ty_rok_den_arr['rok_int'] );
            JRequest::setVar( 'ode_dne_rucne', $cisl_ty_rok_den_arr['ode_dne'] );
            JRequest::setVar( 'view', 'tydny' );
            JRequest::setVar( 'layout', 'form'  );
            JRequest::setVar( 'hidemainmenu', 1);

            parent::display();
        } else {
            $msg = JText::_( $chyba );
            $link = 'index.php?option=com_ohlasky&controller=tyden_rucne&task=zadejDatumy';
            $this->setRedirect($link, $msg, 'error');
        }
    }

    function zadejDatumy() {
        $je_aspon_jedno_akt_misto = $this->jsou_aktivni_mista();
        if ($je_aspon_jedno_akt_misto) {
            JRequest::setVar( 'view', 'tyden_rucne' );
            JRequest::setVar( 'layout', 'form'  );
            JRequest::setVar('hidemainmenu', 1);

            parent::display();

        } else {
            $msg = JText::_( 'Musíte zadat alespoň jedno aktivní místo!' );
            $link = 'index.php?option=com_ohlasky&view=mistas';
            $this->setRedirect($link, $msg);
        }
    }

    //vraci asociativni pole('cislo_tydne_int'=>int, 'rok_int'=>int, 'ode_dne'=>str YYYY-MM-DD)
    //nebo prazdne pole  s klicem 'chyba' pri selhani kdyz tyden daneho cisla jiz byl vytvoren,
    //nebo kdyz vubec neexistuje (nesmyslene datum)
    function getTydenRucne() {
        $hodnoty_nalezeny_bool = false;
        $cisl_ty_rok_den_arr = array();
        $chyba = '';
        $cisl_ty_int = JRequest::getVar('tyden_cislo', '0');
        $cisl_ty_int = intval($cisl_ty_int);
        $rok_int = JRequest::getVar('rok',  '');
        $rok_int = intval($rok_int);
        $ode_dne_dd_int = JRequest::getVar('ode_dne_dd',  '0');
        $ode_dne_dd_int = intval($ode_dne_dd_int);
        $ode_dne_mm_int = JRequest::getVar('ode_dne_mm',  '0');
        $ode_dne_mm_int = intval($ode_dne_mm_int);
        $ode_dne_str = '';
        if (!empty($cisl_ty_int) && (!empty($rok_int))) {
            if (($cisl_ty_int > 1) || ($cisl_ty_int < 54)) {
                //zjistime, zda tyden daneho cisla a roku vubec existuje
                $rok_str = strval($rok_int);
                $dateTime_obj = date_create($rok_str.'-01-01');
                if (is_object($dateTime_obj)) {
                    $pridat_dnu = ($cisl_ty_int * 7) - 7;
                    $dateTime_obj->modify("+".$pridat_dnu." day");
                    $hodnoty_nalezeny_bool = true;
                } else {
                    $chyba = 'Zadali jste chybný rok!';
                }
            } else {
                $chyba = 'Zadané číslo týdne je mimo povolený rozsah!';
            }
        }
        if (($hodnoty_nalezeny_bool == false) && (empty($chyba))) {
            //zjistime, zda bylo zadano datum pocatku tydne
            //a pokusime se vytvorit obj tridy DateTime
            if (!empty($ode_dne_dd_int) && (!empty($ode_dne_mm_int)) && (!empty($rok_int))) {
                $den_str = strval($ode_dne_dd_int);
                $mesic_str = strval($ode_dne_mm_int);
                $rok_str = strval($rok_int);
                $datum_str = $rok_str.'-'.$mesic_str.'-'.$den_str;
                $dateTime_obj = date_create($datum_str);
                if (!(is_object($dateTime_obj))) {
                    //zkusime to s 28.dnem zadaneho mesice
                    $datum_str = $rok_str.'-'.$mesic_str.'-28';
                    $dateTime_obj = date_create($datum_str);
                }
                if (is_object($dateTime_obj)) {
                    $hodnoty_nalezeny_bool = true;
                } else {
                    $chyba = 'Ze zadaných hodnot nelze vytvořit povolené datum!';
                }
            }
        }
        if (($hodnoty_nalezeny_bool == false) && (empty($chyba))) {
            $chyba = 'Musíte zadat buď číslo týdne a rok nebo den, měsíc a rok!';
        }


        if (($hodnoty_nalezeny_bool == true) && (empty($chyba))) {
            $uspesna_zmena_bool = $this->zmenDatumNaPondeli($dateTime_obj);
            $stejnyNeni_bool = $this->neexistujeStejnyTyden($dateTime_obj);
            if (!$stejnyNeni_bool) {
                $chyba = 'Stejný týden již je uložen v databázi. Upravte jej nebo změňte datum.';
            }
        }
        if  (empty($chyba)) {
            $cisl_ty_rok_den_arr['cislo_tydne_int'] = intval($dateTime_obj->format("W"));
            $cisl_ty_rok_den_arr['rok_int'] = intval($dateTime_obj->format("Y"));
            $cisl_ty_rok_den_arr['ode_dne'] = $dateTime_obj->format('Y-m-d');
            $cisl_ty_rok_den_arr['chyba'] = '';
        } else {
            $cisl_ty_rok_den_arr['chyba'] = $chyba;
        }
        return $cisl_ty_rok_den_arr;
    }

    //ocekava objekt tridy DateTime,
    //zmeni predane datum na nejblizsi
    //nadchazejici pondeli
    //pri uspechu vraci true, jinak false
    function zmenDatumNaPondeli(&$dateTime_obj) {
        $uspech_bool = false;
        if (is_object($dateTime_obj)) {
            $cislo_dne_tydne_str = $dateTime_obj->format('N');
            if (!empty($cislo_dne_tydne_str)) {
                switch ($cislo_dne_tydne_str) {
                    case "1":
                        //echo "den je pondělí, ponechame ho";
                        break;
                    case "2":
                        $dateTime_obj->modify("+6 day");
                        break;
                    case "3":
                        $dateTime_obj->modify("+5 day");
                        break;
                    case "4":
                        $dateTime_obj->modify("+4 day");
                        break;
                    case "5":
                        $dateTime_obj->modify("+3 day");
                        break;
                    case "6":
                        $dateTime_obj->modify("+2 day");
                        break;
                    case "7":
                        $dateTime_obj->modify("+1 day");
                        break;
                }
            }
        }
        if ($uspech_bool) {
            return true;
        } else {
            return false;
        }
    }

    //ocekava objekt tridy DateTime,
    //pokud tyden zacinajici stejnym datumem
    //jiz je v databazi, posunuje datum az
    //nalezne volny tyden
    //vraci true/false
    function neexistujeStejnyTyden(&$dateTime_obj) {
        $stejny_neexistuje_bool = false;
        if (is_object($dateTime_obj)) {
            $model = $this->getModel('tydny');

            if ($model->neexistujeStejnyTyden($dateTime_obj)) {
                $stejny_neexistuje_bool = true;
            }
        }
        return $stejny_neexistuje_bool;
    }

    //vraci true/false, podle toho,
    //zda existuje aspon jedno
    //aktivni misto
    function jsou_aktivni_mista() {
        $jsou_aktivni_mista_bool = false;
        $model = $this->getModel('ohlasky_tydne');
        $mista_obj_list = $model->getAktivni_mista();
        if (is_array($mista_obj_list)) {
            $pocet_mist = count($mista_obj_list);
            if ($pocet_mist > 0) {
                $jsou_aktivni_mista_bool = true;
            }
        }
        return $jsou_aktivni_mista_bool;
    }

}

